using System;
using System.Threading;

namespace ConsoleApp1
{
    /// <summary>
    /// 简单的报时测试程序
    /// 用于验证整点报时功能的准确性和唯一性
    /// </summary>
    public class ChimeTestProgram
    {
        private static Timer? _timer;
        private static DateTime _lastChimeTime = DateTime.MinValue;
        private static int _chimeCount = 0;
        private static bool _isRunning = true;

        static void Mainxx(string[] args)
        {
            Console.WriteLine("定时报时功能测试程序");
            Console.WriteLine("==================");
            Console.WriteLine("此程序将验证以下功能：");
            Console.WriteLine("1. 是否能在整点准确触发报时");
            Console.WriteLine("2. 是否只在整点报时一次");
            Console.WriteLine("3. 是否能防止重复报时");
            Console.WriteLine("\n按 Ctrl+C 停止测试\n");

            // 设置 Ctrl+C 事件处理
            Console.CancelKeyPress += OnCancelKeyPress;

            // 创建定时器，每秒检查一次时间
            _timer = new Timer(CheckTime, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));

            // 保持程序运行
            while (_isRunning)
            {
                Thread.Sleep(100);
            }

            // 清理资源
            _timer?.Dispose();
            Console.WriteLine($"\n测试结束，总共报时 {_chimeCount} 次");
        }

        /// <summary>
        /// 定时检查报时条件的回调方法
        /// </summary>
        /// <param name="state">定时器状态参数</param>
        private static void CheckTime(object? state)
        {
            var now = DateTime.Now;
            
            // 每10秒显示一次当前时间（避免输出过多）
            if (now.Second % 10 == 0)
            {
                Console.WriteLine($"当前时间: {now:yyyy-MM-dd HH:mm:ss}");
            }

            // 检查是否为整点
            if (now.Minute == 0 && now.Second == 0)
            {
                // 检查是否在最近一小时内已经执行过报时，防止重复执行
                if ((now - _lastChimeTime).TotalMinutes >= 55)
                {
                    // 执行报时
                    PerformChime(now);
                    
                    // 更新上次报时时间
                    _lastChimeTime = now;
                }
                else
                {
                    Console.WriteLine($"  跳过报时 - 最近一小时内已报时 (上次报时: {_lastChimeTime:HH:mm:ss})");
                }
            }
        }

        /// <summary>
        /// 执行报时操作
        /// </summary>
        /// <param name="time">报时时间</param>
        private static void PerformChime(DateTime time)
        {
            _chimeCount++;
            Console.WriteLine($"\n*** 整点报时 *** 当前时间: {time:HH}点整 (第{_chimeCount}次报时)");
            Console.WriteLine("*** 报时内容: 现在时间是 X 点整 ***\n");
        }

        /// <summary>
        /// Ctrl+C 事件处理
        /// </summary>
        private static void OnCancelKeyPress(object? sender, ConsoleCancelEventArgs e)
        {
            Console.WriteLine("\n正在停止测试...");
            _isRunning = false;
            e.Cancel = true;
        }
    }
}